package 剑指offer;

import java.util.Arrays;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Set;

/**
 * @author zhangmin
 * @create 2021-11-26 9:46
 * 排序
 */
public class day16_45_61 {

    /**===========================================================================================================================
     * 剑指 Offer 45. 把数组排成最小的数
     * 输入一个非负整数数组，把数组里所有数字拼接起来排成一个数，打印能拼接出的所有数字中最小的一个。
     * 自定义排序
     * 先将int数组转换为String数组，自定义比较规则
     * 若拼接字符串 x + y > y + x，则 x “大于” y ；y应该在x的左边
     * 反之，若 x + y < y + x ，则 x “小于” y ；表示x应该在y的左边
     * */
    public String minNumber(int[] nums) {
        String[] ns=new String[nums.length];
        for (int i = 0; i < nums.length; i++) {
            ns[i]=String.valueOf(nums[i]);
        }
        Arrays.sort(ns, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return (o1+o2).compareTo(o2+o1);
            }
        });
        String res="";
        for (String s:ns) {
            res+=s;
        }
        return res;
    }

    /**===========================================================================================================================
     * 剑指 Offer 61. 扑克牌中的顺子
     * 从若干副扑克牌中随机抽 5 张牌，判断是不是一个顺子，即这5张牌是不是连续的。2～10为数字本身，A为1，J为11，Q为12，K为13，而大、小王为 0 ，可以看成任意数字。A 不能视为 14。
     * 1、除大小王外，所有牌 无重复 ；
     * 设此 5张牌中最大的牌为 max ，最小的牌为 min （大小王除外），则需满足：max - min < 5
     * */
    public boolean isStraight1(int[] nums) {
        Arrays.sort(nums);
        int zeroCount=0;
        int i=0;
        while (nums[i]==0){
            zeroCount++;
            i++;
        }
        System.out.println("zero="+zeroCount);
        int count=0;
        for (i=i+1; i < nums.length; i++) {
            System.out.println(i+":"+nums[i]);
            if (nums[i]==nums[i-1]) return false;
            if (nums[i]-nums[i-1]>1){
                count+=(nums[i]-nums[i-1])-1;
                System.out.println("count="+count);
            }
        }
        return zeroCount>=count;
    }
    //set+遍历
    public boolean isStraight2(int[] nums) {
        Set<Integer> set=new HashSet<>();
        int min=14,max=0;
        for (int n:nums) {
            if (n==0)continue;
            if (set.contains(n)) return false;
            min=Math.min(min,n);
            max=Math.max(max,n);
            set.add(n);
        }
        return max-min<5;
    }
    //排序+遍历
    public boolean isStraight(int[] nums) {
        Arrays.sort(nums);
        int minInd=0;
        for (int i = 0; i < 4; i++) {
            if (nums[i]==0) minInd++;
            else if (nums[i]==nums[i+1]) return false;
        }
        return nums[4]-nums[minInd]<5;
    }

    public static void main(String[] args) {
        int[] nums={11,0,9,0,0};
        day16_45_61 obj=new day16_45_61();
        System.out.println(obj.isStraight(nums));
    }
}
